﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace CRM.Database.Model
{
    public class ProductsCollection : AbstractCollection
    {
        protected static List<Products> _list;

        /// <summary>
        /// Словарь номеров SAP
        /// </summary>
        private Dictionary<int, string> _productSAPMaterialNumbers;

        /// <summary>
        /// Список продуктов
        /// </summary>
        public List<Products> ProductsList
        {
            get
            {
                return Entities.Products.ToList();
                if (_list == null)
                    _list = DB.Entities.Products.ToList();
                return _list;
            }
        }


        /// <summary>
        /// Список активных продуктов
        /// </summary>
        public List<Products> ActiveProductsList
        {
            get
            {
                //return Entities.Products.ToList();
                return Entities.Products.Where(c => c.IsActive).ToList();
                return ProductsList.Where(product => product.IsActive).ToList();
            }
        }

        /// <summary>
        /// Словарь номеров SAP
        /// </summary>
        public Dictionary<int, string> ProductSAPMaterialNumbers
        {
            get
            {
                if (_productSAPMaterialNumbers == null)
                {
                    //  var col = new ProductsCollection();
                    _productSAPMaterialNumbers = new Dictionary<int, string>();
                    foreach (Products item in ActiveProductsList)
                    {
                        _productSAPMaterialNumbers.Add(item.IdProduct, item.SAPMaterialNumber);
                    }
                }

                return _productSAPMaterialNumbers;
            }
        }

        /// <summary>
        /// Обнуление статической коллекции
        /// </summary>
        protected override void SetStaticListToNULL()
        {
            _list = null;
        }


        /// <summary>
        /// Получить продукт по номеру САП
        /// </summary>
        /// <param name="sapNumber">Номер САП</param>
        /// <returns>Продукт</returns>
        public Products GetProductBySAPNumber(string sapNumber)
        {
            if (sapNumber.Length == 6)
                sapNumber = "00" + sapNumber;

            int productId = 0;
            Products product = Entities.Products.FirstOrDefault(c => c.SAPMaterialNumber == sapNumber);
            //if (ProductSAPMaterialNumbers.ContainsValue(sapNumber))
            //    //   productId = ProductSAPMaterialNumbers.FirstOrDefault(c => c.Value == sapNumber).Key;
            //    productId = Entities.Products.FirstOrDefault(c => c.SAPMaterialNumber == sapNumber).IdProduct;

            return product;
            if (productId == 0)
                return null;

            return GetItemById(productId) as Products;
        }


        /// <summary>
        /// Получение идентификатора продукта по номеру САП
        /// </summary>
        /// <param name="sapNumber">Номер САП</param>
        /// <returns>Идентификатор</returns>
        public int GetIdProductBySAPNumber(string sapNumber)
        {
            if (sapNumber.Length == 6)
                sapNumber = "00" + sapNumber;
            return ProductSAPMaterialNumbers.FirstOrDefault(c => c.Value == sapNumber).Key;
        }

        #region Implementation of IGetItem

        /// <summary>
        /// Получение списка элементов
        /// </summary>
        /// <returns>Список элементов</returns>
        public override List<object> GetList()
        {
            return new List<object>(ProductsList);
        }

        /// <summary>
        /// Получение типа текущего элемента
        /// </summary>
        /// <returns></returns>
        protected override Type GetItemType()
        {
            return typeof (Products);
        }

        /// <summary>
        /// Получение статического списка для хранения объектов
        /// </summary>
        /// <returns></returns>
        public override object GetStaticCollection()
        {
            return _list;
        }

        /// <summary>
        /// Получение элемента из коллекции по идентификатору
        /// </summary>
        /// <param name="itemId">Идентификатор</param>
        /// <returns>Элемент</returns>
        public override object GetItemById(int itemId)
        {
            return Entities.Products.Find(itemId);
        }

        ///// <summary>
        ///// Получение элемента из коллекции по идентификатору
        ///// </summary>
        ///// <param name="itemId">Идентификатор</param>
        ///// <returns>Элемент</returns>
        //public object GetItemById(int itemId)
        //{
        //    return ProductsList.FirstOrDefault(product => product.IdProduct == itemId);
        //}

        ///// <summary>
        ///// Получение элемента из коллекции по идентификатору
        ///// </summary>
        ///// <param name="itemId">Идентификатор</param>
        ///// <returns>Элемент</returns>
        //public object GetItemByIdFromDatabase(int itemId)
        //{
        //    return DB.Entities.Products.FirstOrDefault(product => product.IdProduct == itemId);
        //}

        #endregion

        #region Implementation of IAddDeleteUpdate

        /// <summary>
        ///// Добавление элемента в коллекцию
        ///// </summary>
        ///// <param name="item">Элемент</param>
        ///// <param name="userLogin">Логин пользователя, который делает изменения</param>
        //public bool Add(object item, string userLogin)
        //{
        //    if (item.GetType() != typeof (Products))
        //        return false;
        //    return DB.Add(item, userLogin);
        //}
        ///// <summary>
        ///// Удаление элемента из коллекции
        ///// </summary>
        ///// <param name="item">Элемент</param>
        ///// <returns>Результат удаления</returns>
        //public bool Delete(object item)
        //{
        //    if (item.GetType() != typeof (Products))
        //        return false;
        //    return DB.Delete(item);
        //}
        ///// <summary>
        ///// Удаление элемента из коллеции по идентификатору
        ///// </summary>
        ///// <param name="itemId">Идентификатор</param>
        ///// <returns>Результат удаления</returns>
        //public bool DeleteById(int itemId)
        //{
        //    object product = GetItemById(itemId);
        //    if (product == null)
        //        return false;
        //    return Delete(product);
        //}
        /// <summary>
        /// Обновление элемента в коллекции
        /// </summary>
        /// <param name="item">Новый элемент</param>
        /// <param name="userLogin">Логин пользователя, который делает изменения</param>
        /// <returns>Результат операции</returns>
        public bool Update(object item, string userLogin)
        {
            var newProduct = (Products) item;
            if (newProduct == null)
                return false;

            var product4Update = GetItemByIdFromDatabase(newProduct.IdProduct) as Products;
            if (product4Update == null)
                return false;

            if (!string.IsNullOrEmpty(newProduct.SAPMaterialNumber))
                product4Update.SAPMaterialNumber = newProduct.SAPMaterialNumber;

            if (newProduct.MountingDepth != 0)
                product4Update.MountingDepth = newProduct.MountingDepth;

            if (newProduct.IdProductGroup != null)
                if (newProduct.IdProductGroup != 0)
                    product4Update.IdProductGroup = newProduct.IdProductGroup;

            if (newProduct.IdProfileGeometry != 0)
                product4Update.IdProfileGeometry = newProduct.IdProfileGeometry;

            if (newProduct.IdPackingColor != null)
                if (newProduct.IdPackingColor != 0)
                    product4Update.IdPackingColor = newProduct.IdPackingColor;


            if (newProduct.IdOutsideColor != null)
                if (newProduct.IdOutsideColor != 0)
                    product4Update.IdOutsideColor = newProduct.IdOutsideColor;

            if (newProduct.IdInsideColor != null)
                if (newProduct.IdInsideColor != 0)
                    product4Update.IdInsideColor = newProduct.IdInsideColor;

            if (newProduct.ProfileLength != 0)
                product4Update.ProfileLength = newProduct.ProfileLength;

            if (!string.IsNullOrEmpty(newProduct.Aricle))
                product4Update.Aricle = newProduct.Aricle;

            if (newProduct.IdInstrumentGeometry != null)
                if (newProduct.IdInstrumentGeometry != 0)
                    product4Update.IdInstrumentGeometry = newProduct.IdInstrumentGeometry;

            if (!string.IsNullOrEmpty(newProduct.ArticleLong))
                product4Update.ArticleLong = newProduct.ArticleLong;

            if (newProduct.Weight != 0)
                product4Update.Weight = newProduct.Weight;


            if (newProduct.StabProPallette != 0)
                product4Update.StabProPallette = newProduct.StabProPallette;

            product4Update.IsActive = newProduct.IsActive;


            if (newProduct.IdProductSystem != null)
                if (newProduct.IdProductSystem != 0)
                    product4Update.IdProductSystem = newProduct.IdProductSystem;

            return base.Update(product4Update, userLogin);
        }

        #endregion
    }
}